<script>

    // function sum(x, y) {
    //     if (y > 0) {
    //         return sum(x + 1, y - 1)
    //     } else {
    //         return x
    //     }
    // }
    // sum(1, 100000)

    // 蹦床函数
    // function trampoline(f) {
    //     while (f && f instanceof Function) {
    //         f = f()
    //     }
    //     return f
    // }

    // function sum(x, y) {
    //     if (y > 0) {
    //         return sum.bind(null, x + 1, y - 1)
    //     } else {
    //         return x
    //     }
    // }

    // var x = trampoline(sum(1, 100000))
    // console.log(x)

    // 尾递归优化
    function tco(f) {
        let value
        let active = false
        let accumulated = []
        return function accumlator() {
            accumulated.push(arguments)
            if (!active) {
                active = true
                while (accumulated.length) {
                    value = f.apply(this, accumulated.shift())
                }
                active = false
                return value
            }
        }
    }

    let sum = tco(function (x, y) {
        if (y > 0) {
            return sum(x + 1, y - 1)
        } else {
            return x
        }
    })

    sum(1, 100000)
</script>